Decomposition of software as discussed in various top-down structure design models (Stephen J Mellor & Paul T. Ward in their work Structured Development for Real-time systems, or Clement L. McGowan & John R. Kelly in their book Top-down Structured Programming Techniques, or Grady Booch in his UML Distilled book among others) all show that hierarchical software designs have certain assumptions. The seminal assumption is that lower levels of design are related to higher levels of design, that is, all of the information contained in a higher design level must be represented in lower levels of the design. This assumption means that each level of decomposition can be reconciled with the next higher level of design until the highest level of design is reached. For example if data from a terminator enters a process at the context level then all such data must appear at the first level of decomposition. If all of the data does not appear then a decomposition error has occurred. Similarly all control, including looping structures found at one level must be reconciled at the higher level. Typically this reconciliation and decomposition error detection is performed manually.
Typically, a developer can only create control flows on an MPT Hierarchical Design graph that can be arrived at via functional decomposition. However, when a design is extracted from existing source code (as occurs with legacy code), control flows which allow for unstructured code are then possible. Unstructured code is code that cannot be arrived at using any functional decomposition model.